package battleOfTheSevenSeas.Client;

import java.awt.Color;
import java.util.ArrayList;

import javax.swing.JOptionPane;

public class TraitementCommande extends Thread {

	private Client clt;
	private String[] tabReponseServeur;
	private TheGreatSea tgs;
	private String cmdserv = "";
	private String reponseServeur;

	public TraitementCommande(String request, Client c){
		this.reponseServeur = request;
		this.clt = c;
		this.tgs = clt.getTgs();
		this.start();
	}

	public void run(){
		tabReponseServeur = reponseServeur.split("/");
		cmdserv = tabReponseServeur[0];
		int sizeTab = tabReponseServeur.length;
		String res = "";
		String s1;
		String s2;
		switch (cmdserv){
		// Game Prologue 
		case "WELCOME" :
			String playerName = tabReponseServeur[1];
			// Changement d'affichage dans le chat
			clt.setJoueur(new Player(playerName));
			res = "<System> Bienvenue a bord " 
					+ playerName
					+ " ! Yarrr !";
			clt.getTgs().refreshText(res);
			clt.getPlayerList().clear();
			tgs.changeTitle(" [ All hail our new commander " + playerName + " ! ] " );
			tgs.changeMenuState(false);
			break;
		case "PLAYERS" :
			// Changement d'affichage dans le chat

			res = "<System> Tous les joueurs sont là !\n" 
					+ "<System> Que le combat commence !" ;
			for (int i = 1; i < sizeTab; i++){
				s1 = tabReponseServeur[i];
				clt.getPlayerList().add(clt.getPlayerList().size(), new Player(s1));
			}
			tgs.updatePlayerNames(tabReponseServeur);
			tgs.refreshText(res);
			break;
		case "ACCESSDENIED" :
			// Changement d'affichage dans le chat
			res = "<System> ACCESSDENIED : " 
					+ "Commande mal formulée, veuillez recommencer";
			tgs.refreshText(res);
			break;
		case "SHIP" :
			// Changement d'affichage dans le chat
			String sizeShip = tabReponseServeur[1];
			res = "<System> Placement d'un sous-marin de taille " 
					+ sizeShip + " : ";
			tgs.refreshText(res);
			tgs.putshipBox(Integer.valueOf(sizeShip));
			break;
		case "OK" :
			// On recoit du serveur que le placement 
			// du sous marin est correct
			int pnb = getPlayerNumber(clt.getJoueur().getPlayerName());
			// On met a jour l'affichage pour placer 
			// le sous marin sur la grille du joueur
			tgs.placeShip(clt.getPlacementSousMarin(), pnb);

			// Changement d'affichage dans le chat
			res = "<System> Sous-marin arrivé à destination sans accrocs";
			tgs.refreshText(res);
			break;
		case "WRONG" :
			// On recoit du serveur que le placement est eronn�. 
			// Changement d'affichage dans le chat
			res = "<System> Sous marin mal placé";
//			res = "<System> You gotta stay in da grid buddy !";
			tgs.refreshText(res);
			break;
		case "ALLYOURBASE" :
			// Changement d'affichage dans le chat
			res = "<System> All your base are belong to us";
			tgs.refreshText(res);
			break;

			// Game Phase
		case "YOURTURN" :
			s1 = tabReponseServeur[1]; // 0-15
			s2 = tabReponseServeur[2]; // A-P
			String s3 = tabReponseServeur[3];
			int playerNumber = getPlayerNumber(clt.getJoueur().getPlayerName());
			Color playerColor = tgs.getPlayerColor(playerNumber);
			res = "<System> C'est votre tour de jouer !\n"
					+ "<System> Position de votre drone : " 
					+ s1 
					+ s2 
					+ "\n<System> Nombre d'actions possibles : " 
					+ s3;
			tgs.changePanelBorder(s1, s2, playerColor);					
			tgs.refreshText(res);
			tgs.droneActions(s1, s2, s3, playerNumber);
			break;
		case "TOUCHE" :
			s1 = tabReponseServeur[1];
			s2 = tabReponseServeur[2];
			tgs.changePanelColor(s1, s2, tgs.getActionColor("touche"));
			res = "<System> Bull's eye ! (" + s1 + s2  + ")";
			tgs.refreshText(res);
			break;
		case "OUCH" :
			s1 = tabReponseServeur[1];
			s2 = tabReponseServeur[2];
			tgs.changePanelColor(s1, s2, tgs.getActionColor("ouch"));
			res = "<System> Houston, we have a problem ("
					+ s1 + s2  + ")";
			tgs.refreshText(res);
			break;
		case "MISS" :
			s1 = tabReponseServeur[1];
			s2 = tabReponseServeur[2];
			tgs.changePanelColor(s1, s2, tgs.getActionColor("miss"));
			res = "<System> Can't touch this ! Du du du du ! (" 
					+ s1 + s2  + ")";
			tgs.refreshText(res);
			break;

			// Game Epilogue
		case "DEATH" :
			res = "<System> Défaite !" 
					+ " Tout vos sous-marins ont été coulés";
			tgs.refreshText(res);
			break;
		case "AWINNERIS" : 
			s1 = tabReponseServeur[1]; // Nom du joueur
			// Demander au joueur s'il veux rejouer					
			s2 = "Le joueur " + s1 + " a gagné !\n"
					+ "Voulez-vous rejouer une partie ?";
			playAgainOrGo(
					tgs.createExtOptionBox(s2, 
							"Fin de partie", 
							new Object[]{"Yes","No"}));
			break;
		case "DRAWGAME" :
			s2 = "Et c'est un Double K.O !\n" 
					+ "Voulez-vous rejouer une partie ?";
			playAgainOrGo(
					tgs.createExtOptionBox(s2, 
							"Fin de partie", 
							new Object[]{"Yes","No"}));
			break;
		case "PLAYERSHIP" :
			s1 = tabReponseServeur[1]; // nom du joueur

			// Placement du bateau sur la grille du spectateur
			int n = "PLAYERSHIP".length() + s1.length() + 2;
			tgs.placeShip(
					reponseServeur.substring(n), getPlayerNumber(s1));
			res = "<System> Joueur " + s1 
					+ " place son sous-marin sur les cases : ";
			for (int i = 2; i <= sizeTab - 2; i = i + 2){
				res += tabReponseServeur[i] 
						+ tabReponseServeur[i + 1] + " ";					
			}
			tgs.refreshText(res);
			break;
		case "PLAYERMOVE" :
			s1 = tabReponseServeur[1]; // nom du joueur
			// Placement du bateau sur la grille du spectateur
			s2 = tabReponseServeur[2];
			s3 = tabReponseServeur[3];
			int playernb = getPlayerNumber(s1);
			Player p = clt.getPlayerList().get(playernb);
			// On colorie l'ancienne valeur du drone en ocean
			tgs.changePanelBorder(p.getDroneOrdonnee(), 
					p.getDroneAbscisse(), 
					tgs.getGridColor());
			p.setDroneOrdonnee(s2);
			p.setDroneAbscisse(s3);
			// On colorie la nouvelle case du drone avec 
			// la couleur du joueur
			tgs.changePanelBorder(s2, s3, tgs.getPlayerColor(playernb));
			res = "<System> Le joueur " + s1 + " bouge en " + s2 + s3 ;
			tgs.refreshText(res);
			break;
		case "PLAYEROUCH" :
			s1 = tabReponseServeur[1]; // nom du joueur
			s2 = tabReponseServeur[2];
			s3 = tabReponseServeur[3];
			// Placement du bateau sur la grille du spectateur
			tgs.changePanelColor(s2, s3, tgs.getActionColor("ouch"));
			res = "<System> Le joueur " + s1 
					+ " touché en case " + s2 + s3;
			tgs.refreshText(res);
			break;
		case "HEYLISTEN" :  
			s1 = tabReponseServeur[1];
			s2 = tabReponseServeur[2];
			s2.replace("\\","");
			res = "<" + s1 + "> " + s2 ;
			tgs.refreshChat(res);
			break;
		}	

	}
	/**
	 * Envoi PLAYAGAIN ou BYE au serveur selon la reponse
	 * @param answer
	 */
	public void playAgainOrGo(int answer){
		String res = "";
		if (answer == JOptionPane.YES_OPTION){
			res = "PLAYAGAIN/";				
		}else if (answer == JOptionPane.NO_OPTION){
			res = "BYE/";
			tgs.changeMenuState(true);
			tgs.resetTitle();
		}
		clt.writeToServer(res);
	}

	/**
	 * Permet de récupérer l'indice du joueur dans la liste des joueurs
	 * @param playername2
	 * @return int valant l'indice du joueur
	 */
	public int getPlayerNumber(String playername2){
		Player res = null;
		ArrayList<Player> pl = clt.getPlayerList();
		for (Player p : pl){
			if (p.getPlayerName().compareToIgnoreCase(playername2) == 0){
				res = p;
			}
		}
		return clt.getPlayerList().indexOf(res);
	}

	/**
	 * Permet de memoriser l'emplacement o� place le sous marin quand on 
	 * envoi un PUTSHIP si jamais le serveur renvoi OK
	 * @param psm
	 */
	public void setPlacementSousMarin(String psm){
		clt.setPlacementSousMarin(psm);
	}


}
